home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / encoders / Alpha2.pm next >
Text File  |  2006-06-30  |  5KB  |  166 lines

  1.  
  2. ##
  3. # This file is part of the Metasploit Framework and may be redistributed
  4. # according to the licenses defined in the Authors field below. In the
  5. # case of an unknown or missing license, this file defaults to the same
  6. # license as the core Framework (dual GPLv2 and Artistic). The latest
  7. # version of the Framework can always be obtained from metasploit.com.
  8. ##
  9.  
  10. package Msf::Encoder::Alpha2;
  11. use strict;
  12. use base 'Msf::Encoder::SkyAlphaNum';
  13. use Pex::Encoder;
  14.  
  15. my $advanced = {
  16.   'ForceUpper' => [0, 'Don\'t even try mixed-case, force upper-case'],
  17.   'NoCompress' => [0, 'Use uncompressed stubs'],
  18. };
  19.  
  20. my $info = {
  21.   'Name'    => 'Skylined\'s Alpha2 Alphanumeric Encoder',
  22.   'Version' => '$Revision: 1.5 $',
  23.   'Authors' => [ 'Berend-Jan Wever <skylined [at] edup.tudelft.nl>', ],
  24.   'Arch'    => [ 'x86' ],
  25.   'OS'      => [ ],
  26.   'Description'  =>  "Skylined's Alpha2 alphanumeric encoder ported to perl",
  27.   'Refs'    => [ ],
  28.   'Keys'    => [ 'alphanum' ],
  29.   'UserOpts' => {
  30.     'GETPCTYPE' => ['geteip', 'BaseAddr for geteip'],
  31.   },
  32. };
  33.  
  34. sub new {
  35.   my $class = shift; 
  36.   return($class->SUPER::new({'Info' => $info, 'Advanced' => $advanced}, @_));
  37. }
  38.  
  39. #
  40. # This code is a port of Skylined's awesome alpha encoder
  41. #
  42. sub EncodePayload {
  43.   my $self = shift;
  44.   my $rawshell = shift;
  45.   my $badChars = shift;
  46.  
  47.   my $type = $self->GetVar('GETPCTYPE');
  48.   my $upper = $self->GetLocal('ForceUpper');
  49.   my $noCompress = $self->GetLocal('NoCompress');
  50.   my $prepend = '';
  51.  
  52.   # notice geteip != seh, geteip will use a os-independant geteip
  53.   if(!defined($type) || $type eq 'geteip') {
  54.     $self->PrintDebugLine(5, 'Trying an os-independant geteip (not alphanum)');
  55.     $prepend = $self->_FindGetEip($badChars);
  56.     if(!defined($prepend)) {
  57.       $self->PrintDebugLine(3, 'Could not find a useable geteip');
  58.       return;
  59.     }
  60.     $type = 'ecx'; # use ecx for a geteip prepend.
  61. #    $self->PrintDebugLine(5, 'Found useable geteip ' . $prepend);
  62.   }
  63.   
  64.   my $lowerChars = join('', 'a' .. 'z');
  65.   if(!$upper && Pex::Text::BadCharCheck($badChars, $lowerChars)) {
  66.     $self->PrintDebugLine(5, 'Lower case characters in badChars, trying upper case');
  67.     $upper = 1;
  68.   }
  69.  
  70.   # possible terminators and valid chars
  71.   my @pterms = (0x41 .. 0x4a);
  72.   my @pchars = (0x41 .. 0x5a, 0x30 .. 0x39);
  73.  
  74.   if(!$upper) {
  75.     push(@pterms, 0x61 .. 0x6a);
  76.     push(@pchars, 0x61 .. 0x7a);
  77.   }
  78.  
  79.   my $valid;
  80.   my $term;
  81.  
  82.   my @terms;
  83.   foreach my $t (@pterms) {
  84.     if(Pex::Text::BadCharCheck($badChars, chr($t), chr($t + 0x10))) {
  85.       $self->PrintDebugLine(5, 'Bad terminator char $t, skipping');
  86.     }
  87.     else {
  88.       push(@terms, chr($t));
  89.     }
  90.   }
  91.  
  92.   if(!@terms) {
  93.     $self->PrintDebugLine(3, 'Could not find a valid terminator.');
  94.     return;
  95.   }
  96.  
  97.   my $term = $terms[int(rand(@terms))];
  98.  
  99.   foreach my $c (@pchars) {
  100.     my $c = chr($c);
  101.     if(Pex::Text::BadCharCheck($badChars, $c)) {
  102.       $self->PrintDebugLine(5, 'Bad valid char ' . ord($c) . ', skipping');
  103.        next;
  104.     }
  105.     next if($c eq $term);
  106.     $valid .= $c;
  107.   }
  108.  
  109.   $self->_Terminator($term);
  110.   $self->_ValidChars($valid);
  111.  
  112.   my $encoderType = $upper ? 'upper' : 'mixed';
  113.  
  114.   if($noCompress) {
  115.     $encoderType .= 'Nocompress';
  116.   }
  117.  
  118.   $self->PrintDebugLine(5, "Trying $encoderType");
  119.   my $decoder = $self->_Encode($rawshell, $encoderType, $type);
  120.   return if(!defined($decoder));
  121.  
  122.   return($prepend . $decoder);
  123. }
  124.  
  125. sub _Terminator {
  126.   my $self = shift;
  127.   $self->{'_Terminator'} = shift if(@_);
  128.   return($self->{'_Terminator'});
  129. }
  130. sub _ValidChars {
  131.   my $self = shift;
  132.   $self->{'_ValidChars'} = shift if(@_);
  133.   return($self->{'_ValidChars'});
  134. }
  135.  
  136. sub _FindGetEip {
  137.   my $self = shift;
  138.   my $badChars = shift;
  139.  
  140.   my @getEips = (
  141.     "\xeb\x03\x59\xeb\x05\xe8\xf8\xff\xff\xff",
  142.     # if it doesnt work, use this behemoth with minimized chars
  143.     # unique chars: 59 EB E8 A4 FF
  144.     "\xeb\x59\x59\x59\x59\xeb\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59".
  145.     "\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59".
  146.     "\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59".
  147.     "\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59".
  148.     "\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59".
  149.     "\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\xe8\xa4\xff\xff\xff",
  150.   );
  151.  
  152.   foreach my $getEip (@getEips) {
  153.     if(Pex::Text::BadCharCheck($badChars, $getEip)) {
  154.       $self->PrintDebugLine(5, 'Badchar in geteip');
  155.     }
  156.     else {
  157.       return($getEip)
  158.     }
  159.   }
  160.  
  161.   $self->PrintDebugLine(5, 'Exhausted getEips, none w/o badChars');
  162.   return;
  163. }
  164.  
  165. 1;
  166.